#ifndef GRAPHICSDISPLAYPLUGIN_H
#define GRAPHICSDISPLAYPLUGIN_H

#include "CameraPluginInterface.h"
#include <QObject>
#include "GraphicsViewArea.h"
#include <QPixmap>
#include <QMap>

class GraphicsDisplayPlugin :public CameraPluginInterface {
    Q_OBJECT
    Q_INTERFACES(CameraPluginInterface)
    Q_PLUGIN_METADATA(IID "Camera.CameraPluginInterface/1.0")
    Q_PROPERTY(QString pluginName READ pluginName CONSTANT)
    Q_PROPERTY(QString description READ description CONSTANT)
public:
    Q_INVOKABLE explicit GraphicsDisplayPlugin(QObject *parent = nullptr);
    ~GraphicsDisplayPlugin() override;

    void initialize() override;
    QString pluginName() const override;
    QString description() const override;
    
    /**
     * @brief 注册图像显示界面接口
     * @param graphicsGuid 图形唯一标识符
     * @param titleString 标题名称
     * @return 是否注册成功
     */
    Q_INVOKABLE QVariant registerImageDisplayWidget(const QVariant& graphicsGuid, const QVariant& titleString);
    
    /**
     * @brief 更新图像接口
     * @param graphicsGuid 图形唯一标识符
     * @param image 要显示的图像
     * @return 是否更新成功
     */
    Q_INVOKABLE QVariant updateImage(const QVariant& graphicsGuid, const QVariant& image);
    
    /**
     * @brief 获取当前缩放比例
     * @param graphicsGuid 图形唯一标识符
     * @return 缩放比例
     */
    Q_INVOKABLE QVariant getCurrentScale(const QVariant& graphicsGuid);
    
    /**
     * @brief 设置缩放比例
     * @param graphicsGuid 图形唯一标识符
     * @param scale 缩放比例
     * @return 是否设置成功
     */
    Q_INVOKABLE QVariant setScale(const QVariant& graphicsGuid, const QVariant& scale);
    
    /**
     * @brief 注销图像显示界面
     * @param graphicsGuid 图形唯一标识符
     * @return 是否注销成功
     */
    Q_INVOKABLE QVariant unregisterImageDisplayWidget(const QVariant& graphicsGuid);

    /**
     * @brief 获取更新显示图像回调函数
     * @param graphicsGuid 图形guid
     * @return 更新显示图像回调函数
     */
    Q_INVOKABLE QVariant getUpdateDisplayImageCallback(const QVariant &graphicsGuid);

    /**
     * @brief 获取更新显示图像界面指针
     * @param graphicsGuid 图形guid
     * @return 更新显示图像界面指针
     */
    Q_INVOKABLE QVariant getUpdateDisplayImageWidget(const QVariant &graphicsGuid);
    
    /**
     * @brief 获取图形场景(画板)指针
     * @param graphicsGuid 图形guid
     * @return 图形场景(QGraphicsScene)指针，通过QVariant包装
     */
    Q_INVOKABLE QVariant getScenePointer(const QVariant &graphicsGuid);
    
    /**
     * @brief 获取当前视图的偏移值
     * @param graphicsGuid 图形guid
     * @return 包含x和y偏移值的QVariantMap
     */
    Q_INVOKABLE QVariant getCurrentOffset(const QVariant &graphicsGuid);
public slots:
    void onPluginMessage(const QString &sender, const QString &message) override;

    /**
     * @brief 处理单位转换信息变化
     * @param imageGuid 图像的唯一标识
     * @param lengthRatio 长度单位转换比例
     * @param timeRatio 时间单位转换比例
     * @param wavelengthRatio 波长单位转换比例
     * @param lengthUnit 长度单位
     * @param timeUnit 时间单位
     * @param wavelengthUnit 波长单位
     * @param xUnit x轴当前单位
     * @param yUnit y轴当前单位
     */
    void onConversionInfoChanged(const QString &imageGuid, double lengthRatio, double timeRatio, double wavelengthRatio, const QString &lengthUnit, const QString &timeUnit, const QString &wavelengthUnit, int xUnit, int yUnit);
private slots:
    /**
     * @brief 关闭图形显示Widget
     * @param graphicsGuid 图形唯一标识符
     */
    void closeImageDisplayWidget(const QString &graphicsGuid);
    
    /**
     * @brief 解析插件消息的辅助函数
     * @param message 消息内容
     * @return QPair<QString, QVariantMap> 解析后的指令名称和参数映射
     */
    QPair<QString, QVariantMap> parsePluginMessage(const QString &message);
private:
    /**
     * @brief 获取或创建图形显示区域
     * @param graphicsGuid 图形唯一标识符
     * @param titleString 标题名称
     * @return 图形显示区域指针
     */
    GraphicsViewArea* getOrCreateViewArea(const QString& graphicsGuid);
    /**
     * @brief 更新显示图像
     * @param pUpdateWidget 更新的widget
     * @param image 待更新的图像
     */
    friend void updateDisplayImage(const QWidget* pUpdateWidget, const QImage &image);
private:
    // 存储所有注册的图形显示区域
    QMap<QString, GraphicsViewArea*> m_RegisterViewAreas;
    // 存储所有未注册的图形显示区域
    QMap<QString, GraphicsViewArea*> m_UnregisterViewAreas;
    QString m_currentActiveGuid; // 当前活动的图形标识符
};
/**
 * @brief 更新显示图像
 * @param pUpdateWidget 更新的widget
 * @param image 待更新的图像
 */
void updateDisplayImage(const QWidget *pUpdateWidget, const QImage &image);
#endif // GRAPHICSDISPLAYPLUGIN_H
